#!/bin/bash

# 应用服务修复脚本
# 用于解决上游服务器连接失败问题

set -e

APP_NAME="xy-user-system"
APP_DIR="/opt/xy-user-pro"
PORT=3000

echo "开始修复应用服务连接问题..."

# 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
    echo "请使用 root 权限运行此脚本"
    exit 1
fi

# 检查端口占用情况
echo "检查端口 $PORT 占用情况..."
if netstat -tlnp | grep ":$PORT " > /dev/null; then
    echo "端口 $PORT 已被占用"
    PID=$(netstat -tlnp | grep ":$PORT " | awk '{print $7}' | cut -d'/' -f1)
    echo "占用进程 PID: $PID"
    
    # 检查是否是我们的应用
    if ps -p $PID -o comm= | grep -q "node"; then
        echo "发现 Node.js 进程，检查是否为我们的应用..."
        if ps -p $PID -o args= | grep -q "main.js\|main"; then
            echo "发现我们的应用正在运行，重启服务..."
            kill $PID
            sleep 3
        else
            echo "端口被其他 Node.js 应用占用，请手动处理"
            exit 1
        fi
    else
        echo "端口被非 Node.js 进程占用，请手动处理"
        exit 1
    fi
else
    echo "端口 $PORT 未被占用"
fi

# 检查应用目录
if [ ! -d "$APP_DIR" ]; then
    echo "错误：应用目录 $APP_DIR 不存在"
    exit 1
fi

cd "$APP_DIR"

# 检查必要文件
if [ ! -f "dist/main.js" ]; then
    echo "错误：应用构建文件不存在，请先构建应用"
    echo "运行: npm run build"
    exit 1
fi

# 检查环境变量文件
if [ ! -f ".env" ]; then
    echo "警告：.env 文件不存在，请确保环境变量已正确设置"
fi

# 创建 systemd 服务文件
echo "创建 systemd 服务文件..."
cat > /etc/systemd/system/${APP_NAME}.service << EOF
[Unit]
Description=XY User System Application
After=network.target mysql.service
Wants=mysql.service

[Service]
Type=simple
User=root
WorkingDirectory=$APP_DIR
EnvironmentFile=$APP_DIR/.env
ExecStart=/usr/bin/node dist/main.js
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=$APP_NAME

# 环境变量
Environment=NODE_ENV=production
Environment=PORT=$PORT

[Install]
WantedBy=multi-user.target
EOF

# 重新加载 systemd
echo "重新加载 systemd..."
systemctl daemon-reload

# 启用并启动服务
echo "启用并启动应用服务..."
systemctl enable $APP_NAME
systemctl start $APP_NAME

# 等待服务启动
echo "等待服务启动..."
sleep 5

# 检查服务状态
echo "检查服务状态..."
if systemctl is-active --quiet $APP_NAME; then
    echo "✅ 应用服务启动成功"
    echo "服务状态:"
    systemctl status $APP_NAME --no-pager -l
else
    echo "❌ 应用服务启动失败"
    echo "查看日志:"
    journalctl -u $APP_NAME --no-pager -l -n 20
    exit 1
fi

# 测试端口连接
echo "测试端口连接..."
if curl -f http://localhost:$PORT/health > /dev/null 2>&1; then
    echo "✅ 应用健康检查通过"
else
    echo "⚠️  应用健康检查失败，但服务已启动"
fi

echo "应用服务修复完成！"
echo "使用以下命令监控服务："
echo "systemctl status $APP_NAME"
echo "journalctl -u $APP_NAME -f"
echo "curl http://localhost:$PORT/health"